perm filename SSERVO.FAI[VV,BGB] blob sn#134388 filedate 1974-12-07 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00009 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE SSERVO
C00005 00003	 LOOP THROUGH POTS CALCULATE THE DISTANCE TO GO
C00007 00004	 SERVO IN PROGRESS, READ PETIT CLOCK AND CALCULATE DELTA T
C00009 00005	 CHECK IF NEW VELOCITY IS TO BE CALCULATED
C00011 00006	 CALCULATE ELAPSED TIME AND DISTANCE SINCE LAST VELOCITY UPDATE
C00013 00007	CHECK IF DESTINATION AT HAND
C00015 00008	 SET UP IRIS MOTOR (NOT VELOCITY SERVOED)
C00018 00009	 CONSTANTS AND BUFFERS
C00020 ENDMK
C⊗;
TITLE SSERVO
	OPDEF LAC[MOVE]↔OPDEF DAC[MOVEM]↔OPDEF GO[JRST]
	OPDEF DZM[SETZM]↔OPDEF DOM[SETOM]

;REGISTERS AVAILABLE TO USER
	STATE↑:	0   	;STATUS BITS
;POT READINGS - PAN, TILT, FOCUS, ZOOM, IRIS.
	P4↑:0 ↔ P5↑:0 ↔ P6↑:0 ↔ P7↑:0 ↔ P8↑:0 ↔ SREF↑:0		;LATEST.
	L4↑:0 ↔ L5↑:0 ↔	L6↑:0 ↔ L7↑:0 ↔ L8↑:0			;FINAL.

;SW SERVO PROGRAM TO SIERRA TV CAMERA
SCALSTP↑:SPCWAR KILL↔POPJ 17,
SSERVO↑: CONSZ 40↔GO WRONG	;DISMISS IF SPACEWAR  STARTED ON PDP-10
	MOVEI 1,=30↔DAC 1,DELT

;READ THE POTS AND SET UP BYTE POINTERS
	CONI 204,7↔ANDI 7,7	;A/D BUSY?
	SKIPN 7↔GO COUNT
	SKIPE POT↔GO BUSY

COUNT:	MOVEI 6,10		;DATA MISSED COUNT
TURNON:	CONO 204,4250		;SET UP HSDC
	CONO 424,722030		;AUTO INDEX FROM CH. 72
	LAC 5,[-2,,0]
GETIT:	MOVEI 4,200
	CONSO 204,1000
	SOJGE 4,.-1		; WAIT FOR DONE FLAG
	JUMPL 4,HUNG
	CONSZ 204,10000
	GO [	CONO 424,4000	; DATA MISSED, TRY AGAIN
		SOJG 6,[MOVEI 3,12
			SOJGE 3,$.
			GO TURNON]
		GO DMISS]
	DATAI 204,BUFFER(5)
	AOBJN 5,GETIT		;GO BACK FOR SECOND WORD
	CONO 424,4000		;TURN OFF A/D
     	LAC 5,[POINT 12,BUFFER]; SAVE REFERENCE VOLTAGE
	ILDB 10,5
	LSH 10,30
	ASH 10,-30
	FSC 10,233
	DAC 10,SREF
	SKIPE POT
	GO LOP-4		; JUMP AROUND SERVO CODE IF ONLY READING POTS
	LAC 2,[POINT 7,DRVWRD]	;SET UP BYTE POINTERS
	LAC  15,[-5,,0]
; LOOP THROUGH POTS CALCULATE THE DISTANCE TO GO
POINT:
;SUBTRACT DESTINATION FROM BUFFER
	ILDB 10,5↔LSH 10,30↔ASH 10,-30↔DAC 10,HOLD
	LAC 11,L4(15)↔FMPR 11,SREF↔FIX 11,233000
	SUB 10,11
	CAMN 15,[-4,,1]↔DAC 10,TILT  		;SAVE TILT VALUE FOR GRAVITY LOADING
	LAC 14,10				;SAVE THE SIGNED VALUE(TOGO)
	DAC 10,DIFF↔MOVMS 10↔DAC 10,TOGO	;DISTANCE LEFT TO GO
	CAMN 15,[-1,,4]↔GO IRIS			;IRIS CONTROL IS NOT VELOCITY SERVO
     	SKIPE INITAL↔GO INPROG			; SERVO IN PROGRESS, UPDATE
	LAC 13,HOLD↔DAC 13,BEGIN(15)		; FIRST TIME INIT FOR EACH POT
	DAC 10,PREV(15)↔FSC 10,233
     	FDVR  10,[75.0]		;CALCULATE NO. OF SEGMENTS
      	FMPR  10,[66.0]		;NUMBER OF MSECS REQUIRED(66 MSECS/SEGMENT)
        FADR  10,[1000.0]	;ADD IN BASE TIME(1000 MSECS)
        DAC 10,TRAJ		;TOTAL TIME REQUIRED
;AVERAGE VELOCITY REQUIRED(SIGNED)
	LAC 10,14↔FSC 10,233
	FDVR 10,TRAJ↔DAC 10,VELOC(15)↔SETZ 10,
;ABSOLUTE DISTANCE LESS THAN TOLERANCE
	LAC 11,14↔MOVMS 11
	CAIG 11,6↔GO ZERO

	DZM SIGN(15)↔MOVEI 10,20 	;TURN ON MOTORS      
	SKIPG 14↔GO .+3
	MOVEI 10,160↔DOM SIGN(15)

ZERO:	DAC 10,SPEED(15)
	CONI 730,OLDTIM		;STORE START TIME
	GO STPTST 		; CHECK STOP CONDITIONS
; SERVO IN PROGRESS, READ PETIT CLOCK AND CALCULATE DELTA T

INPROG: CONI 730,TIME
	LAC 4,TIME↔LSH 4,-24	;SHIFT OUT MICROSECONDS.
	LAC 11,OLDTIM↔LSH 11,-24
	DZM 13
	CAMN 4,11↔GO TIMEOK	;SKIP IF ANY CHANGE IN SECS AND MINUTES
	LAC 4,TIME↔LSH 4,-32	;CALCULATE TOTAL ELAPSED TIME
	LAC 11,OLDTIM↔LSH 11,-32
	CAME 4,11↔ADD 13,[344703400] 	;ADD IN MINUTE COUNT IN MICROSECS 
	LAC 7,TIME↔LSH 7,12↔LSH 7,-36
	LAC 11,OLDTIM↔LSH 11,12↔LSH 11,-36
	SUB 7,11↔IMUL 7,[3641100]
	ADD 13,7

TIMEOK:	LAC 4,TIME↔LSH 4,=16↔LSH 4,-=16
	LAC 11,OLDTIM↔LSH 11,=16↔LSH 11,-=16
	SUB 4,11			;TOTAL ELAPSED TIME
	ADD 13,4↔FSC 13,233		;FLOAT TIME
	LAC 4,13↔FDVR 4,[1000.0]	;CHANGE TO MSECS

;CHECK TIMEOUT LOOP AND VELOCITY UPDATE 
	LAC 3,4↔FIX 3,233000↔DAC 3,TOTEL	;TOTAL ELAPASED TIME IN MSECS
;TEST IF SPACEWAR MODULE HAS RUN TOO LONG - DISMISS AFTER 9 SECS
	CAIG 3,=9000↔GO TIMCHK
	LAC 7,[1,,0]↔IORM 7,STATE		;NON-TERMINATION OF SSERVO
	GO TRNOFF 
; CHECK IF NEW VELOCITY IS TO BE CALCULATED

TIMCHK:	LAC 14,TOTEL↔SUB 14,DEL1
	CAIG 14,=30↔GO CHECK	;ELAPSED TIME > 30 MSECS
	FSC 14,233↔DAC 14,DELT	;FLOATING ELAPSED TIME SINCE LAST VEL UPDATE
	LAC 14,TOTEL↔DAC 14,DEL1
 	DOM VELCAL+0↔DOM VELCAL+1
	DOM VELCAL+2↔DOM VELCAL+3

;CALCULATE DISTANCE COVERED IF VELOCITY UPDATE
CHECK:	SKIPN VELCAL(15)↔GO OK
       	LAC 6,BEGIN(15)↔LAC 10,HOLD
	SUB 6,10↔FSC 6,233↔DAC 6,DISTNZ(15)
	LAC 14,HOLD↔DAC 14,BEGIN(15)
OK:	LAC 6,TOGO↔CAIL 6,=320↔GO MUMBLE  ;CALCULATE IF DISTANCE TO TARGET < 300
	SKIPE FINAL(15)↔GO DECREM
	DOM FINAL(15)
	LAC 7,DIFF↔DAC 7,STOP(15)
	LAC 7,VELOC(15)↔FDVR 7,[4.0]↔DAC 7,VELSTR(15)
	LAC 7,SPEED(15)↔LAC 7,INDEX
DECREM:	LAC 6,VELSTR(15)	; DECREMENT VELOCITY IF FINAL TURNED ON
        DZM 13↔LAC 4,TOGO
	AOS 13↔SUBI 4,=80
        SKIPLE 4↔GO .-3
        FSC 13,233↔FMPR 6,13
;CHECK FOR SIGN DIFFERENCE 
        SKIPG DIFF↔GO LESS
	SKIPG STOP(15)↔GO LESS+1
	GO POS
; CALCULATE ELAPSED TIME AND DISTANCE SINCE LAST VELOCITY UPDATE

LESS:	SKIPL STOP(15)↔MOVN 6,6
POS:	DAC 6,VELOC(15)
MUMBLE:	SKIPN VELCAL(15)↔GO NEXT
	LAC 11,DISTNZ(15)
	SKIPG INDEX↔LAC 10,BEGIN(15)
        CAMN 10,HOLD↔GO ADDTIM
	SUB 10,HOLD↔FSC 10,233
	FADR 11,10		;ADDITIONAL DISTANCE COVERED
ADDTIM:	SKIPG INDEX↔LAC 7,DELT		;TIME INTERVAL
       	LAC 10,TOTEL
	CAMN 10,DEL1↔GO DOIT
	FSC 10,233
	LAC 13,DEL1↔FSC 13,233
        FSBR 10,13
	FADR 7,10		;ADD IN ADDITIONAL TIME
DOIT: 	SKIPG INDEX

; DO FEEDBACK CALCULATIONS

     	FDVR 11,7       	;AVERAGE VELOCITY OVER PAST 20 MSECS
SKIPG INDEX↔FSBR 11,VELOC(15)	;DIFFERENCE AVERAGE VELOCITY AND PLANNED
				;	VELOCITY(POT UNITS/TIC)
        FDVR 11,VELOC(15)  	;PERCENTAGE DIFFERENCE(SIGNED)
        FMPR  11,GAIN(15)  	;MULTIPLY BY FEEDBACK GAIN
        FIX 11,233000		;FIX VELOCITY GAIN
    	LAC 10,SPEED(15)
	TRNN 10,100↔GO AHEAD	;ADD IN VELOCITY GAIN
	SKIPG DIFF↔MOVNS 11
        SUB 10,11
	CAIG 10,100↔MOVEI 10,100
	CAIL 10,177↔SUBI 10,177
	GO SET
;CHECK IF DESTINATION AT HAND

AHEAD:	SKIPL DIFF↔MOVNS 11
      	ADD 10,11
      	CAIL 10,77↔MOVEI 10,77
	CAIG 10,↔ADDI 10,177
SET:	CAIN 10,↔MOVEI 10,1
;GRAVITY LOADING FOR TILT AND FOCUS
	CAIG 15,2↔CAIN 15, ↔GO NOGRAV
	LAC 7,[0,,3777]
        SUB 7,TILT
	FSC 7,233
	FDVR 7,[4096.0]	;DIVIDE BY 4096
	LAC 6,7↔FMPR 6,6↔FMPR 6,7
	FMPR 7,[0.5706]↔FMPR 6,[-0.64322]↔FADR 6,7	;CALCULATE SIN(X)
	FMPR 6,GRVTRM(15)↔FIX 6,23300
	SKIPL DIFF↔GO DOWNER
	ADD 10,6↔CAIL 10,77↔MOVEI 10,77
	GO NOGRAV

DOWNER:	ADD 10,6↔CAIL 10,177↔MOVEI 10,177
NOGRAV:	DAC 10,SPEED(15)
STPTST:	LAC 7,TOGO		; TEST STOP CONDITIONS
	CAML 7,DEDBND(15)↔GO NEXT
	DZM SPEED(15)
	DOM BEEND(15)
NEXT:	LAC 1,SPEED(15)		;SET UP DRIVE WORD FOR THIS MOTOR
     	IDPB 1,2		;LOAD PROPER VOLTAGE INTO DRIVE WORD
	LAC 13,HOLD
	DAC 13,LAST(15)
	DZM VELCAL(15)
	GO LOOP
; SET UP IRIS MOTOR (NOT VELOCITY SERVOED)

;TOLERANCE ON IRIS - SPECIAL CASE
IRIS:	CAIL 10,20↔GO .+3 
	DOM BEEND(15)↔GO LOOP
	SKIPE INITAL↔GO[
		MOVEI 11,(10)↔SUB 11,PREV(15)↔MOVMS 11
		CAILE 11,3↔GO .+1↔GO LOOP]	;IRIS IS HUNG
	DAC 10,PREV(15)
      	LAC 11,DRVWRD↔TRO 11,100	;SET ENABLE BIT (BIT 29)
        SKIPL HOLD↔TRO 11,200		;SET CLOSE BIT(BIT 28)
        DAC 11,DRVWRD
LOOP:   AOBJN 15,POINT		;BRANCH BACK FOR NEXT FUNCTION
	DOM INITAL
	DATAO 410,DRVWRD	; END OF SERVO IF MOTORS ALL OFF
       	SKIPN DRVWRD↔GO TRNOFF
	DZM DRVWRD↔GO COUNT	; RETURN TO READ POTS AGAIN
; END OF SERVO - CHECK FOR HUNG MOTORS

TRNOFF:	DZM 1 
	SKIPN BEEND+0↔IORI 1,4000
	SKIPN BEEND+1↔IORI 1,2000
	SKIPN BEEND+2↔IORI 1,1000
	SKIPN BEEND+3↔IORI 1,10000
	SKIPN BEEND+4↔IORI 1,100000↔IORM 1,STATE
; ENTER HERE IF ONLY READING POTS
       	LAC 13,[NULL,,NULL+1]↔BLT 13,FINAL+4
	SETZ 15,↔LAC 13,[POINT 12,BUFFER,11]
;DEPOSIT FINAL POT READINGS IN P4-P8
LOP:	ILDB 14,13↔LSH 14,30↔ASH 14,-30
	FSC 14,233↔FDVR 14,SREF↔DAC 14,P4(15)
	AOS 15↔CAIE 15,5↔GO LOP
	MOVEI 1,1↔IORM 1,STATE↔DZM POT		;POTS READ ONLY.
KILL:	DATAO 410,[0]↔DZM INITAL
	DISMIS

;ERRORS...

BUSY:	MOVEI 7,100↔GO DMISS+1
HUNG:	CONO 424,4000↔SKIPA 7,[200]
DMISS:	MOVEI 7,40↔IORM 7,STATE↔GO TRNOFF
WRONG:	MOVEI 7,400↔GO DMISS+1
; CONSTANTS AND BUFFERS

LAST:	BLOCK 5		;LAST POT READING
VELOC:	BLOCK 5		;AVERAGE VELOCITY NEEDED
SPEED:	BLOCK 5		;CURRENT SPEED
BEGIN:	BLOCK 5		;INITIAL POT READING
STOP:	BLOCK 5 
VELSTR: BLOCK 5
PREV:	BLOCK 5		;INITIAL DISTANCE TO GO
VELCAL:	BLOCK 5
DISTNZ:	BLOCK 5
SIGN:	BLOCK 5		;DIRECTION OF MOTOR DACENT
GAIN:	576246,,314632	;-1.35
	576363,,146315	;-1.05
	576400,,0      	;-1.0
	576363,,146315	;-1.05
	576400,,0	;-1.0(NOT USED)
DEDBND: 6		;DRIFT DISTANCE
	=24
	6
	6
	6		;(NOT USED)
GRVTRM: 0		;NOT USED
        203500,,0 	;GRAVITY LOADING TERM FOR TILT(5.0)
	576400,,0	;FOCUS(1.0)
	0		;NOT USED
	0		;NOT USED
S4:	BLOCK 5
INDEX:	0
TOTEL:	0

TILT:	0
DELT:	0
TIME:	0
BUFFER:	BLOCK 2		;RAW POT READINGS
OLDTIM:	0		;LAST TIME READ
NULL:   0		;THIS STARTS THE NULL OUT REGION
DRVWRD:	0
HOLD:	0
TOGO:	0
TRAJ:	0
DIFF:	0
FIRST:	0
DEL1:	0
POT↑:    0
INITAL:	0
BEEND:	BLOCK 5
FINAL:  BLOCK 5

END